package cn.bugstack.springframework.beans.factory.support;

import cn.bugstack.springframework.beans.BeansException;
import cn.bugstack.springframework.beans.factory.config.BeanDefinition;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;


/**
 * 采用JDK实例化
 * 简单实例化策略类，实现了InstantiationStrategy接口，用于创建bean的实例。
 */
public class SimpleInstantiationStrategy implements InstantiationStrategy {

    /**
     * 通过指定的构造函数和参数来实例化一个对象。
     *
     * @param beanDefinition 描述bean的定义，包含bean的类信息等。
     * @param beanName bean的名称。
     * @param constructor 要使用的构造函数，如果为null，则使用无参构造函数。
     * @param args 调用构造函数时传递的参数数组。
     * @return 实例化的对象。
     * @throws BeansException 如果实例化过程中发生错误。
     */
    @Override
    public Object instantiate(BeanDefinition beanDefinition, String beanName, Constructor constructor, Object[] args) throws BeansException {
        Class<?> beanClass  = beanDefinition.getBeanClass(); // 获取bean的类对象
        try {
            if (null != constructor) {
                // 如果指定了构造函数，使用指定的构造函数实例化对象
                return beanClass.getDeclaredConstructor(constructor.getParameterTypes()).newInstance(args);
            } else {
                // 如果没有指定构造函数，使用无参构造函数实例化对象
                return beanClass.getDeclaredConstructor().newInstance();
            }
        } catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
            // 在实例化过程中如果出现异常，抛出BeansException
            throw new BeansException("Failed to instantiate [" + beanClass.getName() + "]", e);
        }
    }

}
